// 文件操作
const fs = require('fs')
const pfs = fs.promises
const path = require('path')
const os = require('os')
// const util = require('util')
// const readFile = util.promisify(fs.readFile)


// 创建一个文件
// const str = '你好!!aaa' + os.EOL;
// 字符串转为buffer流
// console.log(Buffer.from(str));

// 异步
// 回调函数中的参数，如果返回为null则表示，成功，为对象表示写入异常
// fs.writeFile(path.resolve('data/lisi.txt'), Buffer.from(str), err => console.log(err))
// fs.writeFile(path.resolve('data/lisi.txt'), str, err => console.log(err))

// 同步
/* try {
  fs.writeFileSync(path.resolve('data/lisi.txt'), str)
} catch (e) { }
 */


/* fs.writeFile(path.resolve('data/lisi.txt'), str, {
  encoding: 'utf-8',
  // 在linux和mac下有效果 权限有关，一般不设置  777 rwx 421 
  // 第1个7 当前文件所属用户
  // 第2个7 当前文件所属的组
  // 第3个7 其它用户
  // mode:
  // w 写且覆盖
  // flag: 'w'
  // a 写且追加
  flag: 'a'
}, err => console.log(err))
 */

// fs.appendFile(path.resolve('data/lisi.txt'), str, e => console.log(e))


// 读文件
let filepath = path.resolve('data/lisi.txt');
let newfilepath = path.resolve('data/lisi-bak.txt');
// nodejs回调参数 第1个都是错误参数
/* fs.readFile(filepath, (err, buffer) => {
  console.log(buffer.toString());
}) */

/* fs.readFile(filepath, 'utf-8', (err, data) => {
  console.log(data);
}) */

/* let data = fs.readFileSync(filepath, 'utf-8');
console.log(data); */

/* fs.readFile(filepath, 'utf-8', (err, data) => {
  fs.writeFile(newfilepath, data, err => console.log(err))
})
 */

// readFile(filepath).then(data => console.log(data.toString()))


// readFile(filepath).then(data => console.log(data))

/* ; (async function () {
  let data = await readFile(filepath)
  console.log(data);
})() */

// 复制文件
// pfs.readFile(filepath).then(data => pfs.writeFile(newfilepath, data))

// 数据流  管道
// 读流 fs.createReadStream
// 写流 fs.createWriteStream
// fs.createReadStream(filepath).pipe(fs.createWriteStream(newfilepath))

// 删除文件  和操作系统相关，有的时候，可能删除不掉，此时就需要在操作系统层面去解决
// sudo chmod -R 777 data
// fs.unlink(newfilepath, err => console.log(err))

// 查看文件信息
/* fs.stat(filepath, (err, stat) => {
  console.log(stat.isFile()); // 判断是否为文件 true
  console.log(stat.isDirectory()); // 判断是否为目录(文件夹) true
}) */


// 判断当前文件或目录是否存在
// console.log(fs.existsSync(filepath))


// =======================  目录
// f:\www\clas\nodejs\data\admin\bb\cc
const dirpath = path.join(__dirname, 'data', 'admin')
// 创建目录 
// fs.mkdir(dirpath, err => console.log(err))
// 迭代创建
// fs.mkdir(dirpath, { recursive: true }, err => console.log(err))

// 读目录 返回是一个数组
/* fs.readdir(dirpath, 'utf-8', (err, data) => {
  console.log(data);
}) */



// 删除 rmdir默认只能删除空目录
// fs.rmdir(dirpath, err => { console.log(err); })
// 递归删除
// fs.rmdir(dirpath, { recursive: true }, err => { console.log(err); })

delDir(dirpath, () => { })

function delDir(dirpath, cb) {
  fs.stat(dirpath, (err, stat) => {
    if (stat.isFile()) {
      fs.unlink(dirpath, cb)
    } else {
      fs.readdir(dirpath, 'utf-8', (err, dirs) => {
        if (dirs.length == 0) {
          // 此目录是一个空目录
          fs.rmdir(dirpath, cb)
        } else {
          // 读取的目录中的相对路径转为绝对路径
          dirs = dirs.map(item => path.join(dirpath, item))

          let index = 0;
          function doneFn() {
            if (++index == dirs.length) {
              fs.rmdir(dirpath, cb)
            }
          }
          dirs.forEach(dir => {
            delDir(dir, doneFn)
          })
        }
      })
    }
  })
}



// 目录和文件都可以重命名
// fs.rename()





/* function readFile(filepath) {
  return new Promise((resolve, reject) => {
    fs.readFile(filepath, 'utf-8', (err, data) => {
      if (!err) {
        resolve(data)
      } else {
        reject(err)
      }
    })
  })
}
 */

